package com.deyuanyun.pic.insp.service.inspresult.impl;

import com.deyuanyun.pic.common.tool.JXL;
import com.deyuanyun.pic.common.util.CommonUtil;
import com.deyuanyun.pic.insp.controller.dto.DefectMetaLossFeatureType;
import com.deyuanyun.pic.insp.controller.dto.FeatureTypeForMetalLoss;
import com.deyuanyun.pic.insp.controller.dto.InspresultByFind;
import com.deyuanyun.pic.insp.controller.dto.MetalLossPO;
import com.deyuanyun.pic.insp.domain.DefectStatistics;
import com.deyuanyun.pic.insp.mapper.DefectMetalLossMapper;
import com.deyuanyun.pic.insp.mapper.DefectStatisticsMapper;
import com.deyuanyun.pic.insp.mapper.InspStatMapper;
import com.deyuanyun.pic.insp.service.inspresult.MetalLossService;
import com.deyuanyun.pic.insp.util.InspExportUtil;
import com.deyuanyun.pic.settings.support.biz.CodeUtil;
import com.github.pagehelper.Page;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;

/**
 *
 * @ClassName MetalLossServiceImpl
 * @Description 内检测-》 金属损失Service实现
 * @author 荣华兴
 * @date 2015年9月24日
 */
@Service
public class MetalLossServiceImpl extends BaseServiceImpl implements MetalLossService {
	@Resource
	DefectMetalLossMapper metalLossMapper;
	@Resource
	DefectStatisticsMapper defectStatisticsMapper;



	public Page<LinkedHashMap<String,Object>> findPage(HashMap param) {
		handlerParam(param);
		initPage();
		param.put("reference",getReference(param,"PIC_INSP_DEFECT_META_LOSS"));
		Page<LinkedHashMap<String, Object>> data=metalLossMapper.findPage(param);
		for(LinkedHashMap<String, Object> map:data)
		{
			map.put("REPAIR_SUGGESTION", CodeUtil.getName((String) map.get("REPAIR_SUGGESTION")));
		}
		return data;
	}


	public List findObjectList(HashMap param) {
		handlerParam(param);

		//获取环焊缝导出字段列表
		String filedList = InspExportUtil.getFiledList("METALLOSS");

		//获取参考信息列表
		String reference = InspExportUtil.getReference(filedList,param);
		param.put("fileds",filedList);
		param.put("reference",reference);
		param.put("orderBy","c4");

		Page<LinkedHashMap<String,Object>> data=metalLossMapper.findPageExport(param);

		return data;
	}


	@Override
	public List queryExportApprarse(HashMap param) {
		handlerParam(param);
		Page<LinkedHashMap<String,Object>> data=metalLossMapper.queryExportApprarse(param);
		for(LinkedHashMap m:data){
			m.remove("IDDS");
			if(null != m.get("R6"))
			{
				m.put("R6",((BigDecimal)m.get("R6")).setScale(3,   BigDecimal.ROUND_HALF_UP).doubleValue());
			}
		}
		List<List<String[]>> result=new ArrayList<List<String[]>>();
		List<String[]> lsr = JXL.toList(data, "yyyy-MM-dd");
		result.add(lsr);
		return result;
	}



	/**
	 * @Description 根据缺陷类型查出对应缺陷的总数
	 * @author 荣华兴
	 * @date 2015年9月28日
	 * @param inspresultByFind
	 * @return
	 */
	@Override
	public int CountMetalLoss(InspresultByFind inspresultByFind) {
		return metalLossMapper.countMetalLoss(inspresultByFind.getFeatureType());
	}



	/**
	 * @Description 根据选择的检测管段ID查询检测任务
	 * @author 荣华兴
	 * @date 2015年9月28日
	 * @param taskLineId
	 * @return
	 */
	@Override
	public List getTaskByTaskLineId(String taskLineId) {
		// TODO Auto-generated method stub
		return metalLossMapper.getTaskByTaskLineId(taskLineId);
	}

	/**
	 * @Description 根据选择的检测管段ID查询物理管段
	 * @author 荣华兴
	 * @date 2015年9月28日
	 * @param taskLineId
	 * @return
	 */
	@Override
	public List getSegmentByTaskLineId(String taskLineId) {
		// TODO Auto-generated method stub
		return metalLossMapper.getSegmentByTaskLineId(taskLineId);
	}

	/**
	 * @return
	 * @Description: 根据页面传值，统计各金属损失数
	 * @Author: 荣华兴
	 * @Create Date: 2015年10月7日
	 * @参数：@param iRBF
	 * @参数：@return
	 * @Return:List
	 */
	@Override
	public List<HashMap<String, Object>> MetalLossCount(InspresultByFind IRBF) {
		//金属损失总数
		List<MetalLossPO> list=metalLossMapper.MetalLossCount(IRBF);
		List<HashMap<String, Object>> ls =new ArrayList();
		HashMap<String ,Object> ma=new HashMap<String ,Object>();
		HashMap<String ,Object> map;
		int allCount=0;
		//取出数据库查询出值集合中的类型
		for(MetalLossPO iB :list){
			map=new HashMap<String ,Object>();
			String type=(iB.getFeatureType()==null ? null : iB.getFeatureType().toString());
			int count=(iB.getCount()==null ? 0 :iB.getCount());
			allCount += count;
			if(type!=null){
				DefectMetaLossFeatureType enumType=DefectMetaLossFeatureType.valueOf(type);
				if(FeatureTypeForMetalLoss.getinstance().isMetalLoss(type)){
					String flawTypeName = FeatureTypeForMetalLoss.getinstance().getflawTypeName(enumType);
					map.put("flawTypeName", flawTypeName);
					map.put("count", count);
				}
				ls.add(map);
			}
		}
		ma.put("flawTypeName","所有金属损失");
		ma.put("count", allCount);
		ls.add(0,ma);
		return ls;
	}

	/**
	 *
	 * @Description 根据条件查询总数
	 * @author 荣华兴
	 * @date 2015年9月25日
	 * @param IRBF(含，管道、检测管道、检测任务、物理管段，+金属损失类型)
	 * @return
	 */
	@Override
	public HashMap<String, Object> MetalLossAmount(InspresultByFind IRBF) {
		/*取出code表中在枚举中映射的值,并且分别查询*/
		HashMap<String ,Object>ma=new HashMap<String ,Object>();
		HashMap<String ,Object> map=null;
		//将对应的金属损失类型从枚举中取出，放入数组中(页面需求4种金属损失，取出对应的枚举值)
		List<DefectMetaLossFeatureType> typeList=new ArrayList<DefectMetaLossFeatureType>();
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_NBJSSS);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_NBZCQX);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_WBJSSS);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_WBZCQX);

		/*循环数组*/
		for(DefectMetaLossFeatureType featureType: typeList){
			map=new HashMap<String ,Object>();
			/*取出code*/
			String code = featureType.getCode();
			/*取出table备用*/
			String Lable = featureType.getLable();
			/*将code存入实体中传入数据层*/
			IRBF.setFeatureType(code);
			System.out.println(IRBF.getFeatureType());
			/*查询该损失的总体金属损失统计*/
			int  allcount =metalLossMapper.MetalLossCountToOne(IRBF);
			/*将总值和名称存入map中*/
			map.put("name", Lable);
			map.put("allcount", allcount);
			/*将对应的枚举值存入，待取*/
			map.put("code", code);
			/*查询该金属损失下各阶段的金属损失统计*/
			Map ls=metalLossMapper.findByLossType(IRBF);
			/*将List的值存入map，待取*/
			map.put("List", ls);
			ma.put(code, map);
		}

		return ma;
	}
	/**
	 * @Description: 根据条件查询金属损失总数
	 * @Author: 荣华兴
	 * @Create Date: 2015年10月7日
	 * @参数：@param IRBF
	 * @参数：@return
	 * @Return:int
	 */
	@Override
	public int allmetalLoss(InspresultByFind IRBF) {
		// TODO Auto-generated method stub
		return metalLossMapper.allMetalLoss(IRBF);
	}

	@Override
	public List metalLossStatistics(InspresultByFind IRBF) {
		// TODO Auto-generated method stub
		return null;
	}

	/**
	 * @Description: 根据条件获得管段的长度
	 * @Author: 荣华兴
	 * @Create Date: 2015年10月12日
	 * @参数：@return
	 * @Return:Integer
	 */
	public HashMap getMileageByLine(InspresultByFind IRBF) {
		// TODO Auto-generated method stub

		return metalLossMapper.getMileageByLine(IRBF);

	}

	/**
	 * @Description: 查询总体金属损失在对应的绝对里程上的数量
	 * @Author: 荣华兴
	 * @Create Date: 2015年10月13日
	 * @参数：@return
	 * @Return:List
	 */
	public void getCountByMaleage() {

		//获取金属损失表中的所有管道、管道、检测任务、检测管道的分组
		List<HashMap<String ,Object>> list = metalLossMapper.getMetalQueryTerms();
		//对每组数据进行统计，并插入
		for(HashMap<String ,Object> map : list){
			InspresultByFind inspresultByFind = new InspresultByFind();
			//取出值，
			String lineId=(String) map.get("PIPE_LINE_ID");
			String segmentId=(String) map.get("PIPE_SEGMENT_ID");
			String inspSegmentId=(String) map.get("INSP_SEGMENT_ID");
			String inspTaskId=(String) map.get("INSP_TASK_ID");

			//插入实体
			inspresultByFind.setLineId(lineId);
			inspresultByFind.setSegmentId(segmentId);
			inspresultByFind.setInspSegmentId(inspSegmentId);
			inspresultByFind.setInspTaskId(inspTaskId);

			//获得相对里程 含 起点 、终点
			HashMap mileage = this.getMileageByLine(inspresultByFind);

			//计算出相对里程的1/10fromMileage  toMileage
			BigDecimal staM = BigDecimal.ZERO;
			if (mileage.get("fromMileage".toUpperCase())!=null){
				staM = (BigDecimal) mileage.get("fromMileage".toUpperCase());
			}
			BigDecimal endM = BigDecimal.ZERO;
			if (mileage.get("toMileage".toUpperCase())!=null){
				staM = (BigDecimal) mileage.get("toMileage".toUpperCase());
			}
			// 计算出管段的总长度
			BigDecimal relativeMileage=endM.subtract(staM) ;

			// 总长度分成10等份，没一节的长度
			BigDecimal avgs = relativeMileage.divide(new BigDecimal(10));
			String code="ALLMETALOSS";
			String name ="所有金属损失";

			//将avg作为参数传入查询对应里程的金属损失数
			for(int i=1;i<=10;i++){
				// 第几个的管道长度
				BigDecimal avgLength = new BigDecimal(i).multiply(avgs);
				//计算起始距离里程
				BigDecimal startMileage = staM.add(avgLength).subtract(avgs);
				//将计算的相对里程+起始里程组合成绝对里程
				BigDecimal endMileage=staM.add(avgLength);

				//将mileage传入实体中查询
				inspresultByFind.setStartMileage(startMileage.doubleValue());
				inspresultByFind.setEndMileage(endMileage.doubleValue());
				int ls=metalLossMapper.getAllCountByMileage(inspresultByFind);

				//将取出的值写入表PIC_INSP_DEFECT_STATISTICS中，待查
				//存入PIC_INSP_DEFECT_STATISTICS中的值分别为 ：金属损失类型 、相对里程(m)、开始绝对里程(m)、结束绝对里程(m)
				//损失数/内检测任务ID 管道ID 、管段ID、检测管段ID
				DefectStatistics defectStatistics=new DefectStatistics();
				defectStatistics.setId(CommonUtil.getUUID());
				defectStatistics.setInspTaskId(inspresultByFind.getInspTaskId());
				defectStatistics.setPipeLineId(inspresultByFind.getLineId());
				defectStatistics.setPipeSegmentId(inspresultByFind.getSegmentId());
				defectStatistics.setInspSegmentId(inspresultByFind.getInspSegmentId());
				defectStatistics.setMajorCode(code);//统计类型编号
				defectStatistics.setMinorCode(i+"");
				defectStatistics.setName(name);//统计名称
				defectStatistics.setValue(new BigDecimal(ls));//统计的值
				defectStatistics.setRelativeMileage(relativeMileage);//相对里程
				defectStatistics.setBeginMileage(startMileage);//起始里程
				defectStatistics.setEndMileage(endMileage);//终点里程

				defectStatisticsMapper.insert(defectStatistics);
			}

		}
	}

	/**
	 * @Description: 查询具体的金属损失类型对应里程上的数量
	 * @Author: 荣华兴
	 * @Create Date: 2015年10月14日
	 * @参数：@return
	 * @Return:List
	 */
	public void getMetalLossCountByMaleage(InspresultByFind IRBF){
		/*取出code表中在枚举中映射的值,并且分别查询*/
		//将对应的金属损失类型从枚举中取出，放入数组中(页面需求4种金属损失，取出对应的枚举值)
		List<DefectMetaLossFeatureType> typeList=new ArrayList<DefectMetaLossFeatureType>();
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_NBJSSS);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_NBZCQX);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_WBJSSS);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_WBZCQX);
		//获得相对里程 含 起点 、终点
		HashMap mileage=(HashMap) this.getMileageByLine(IRBF);
		//计算出相对里程的1/10fromMileage  toMileage

		BigDecimal staM = (BigDecimal) mileage.get("fromMileage".toUpperCase())!=null?(BigDecimal) mileage.get("fromMileage".toUpperCase()):BigDecimal.ZERO;
		BigDecimal endM = (BigDecimal) mileage.get("toMileage".toUpperCase())!=null?(BigDecimal) mileage.get("toMileage".toUpperCase()):BigDecimal.ZERO;
		BigDecimal relativeMileage=endM.subtract(staM) ;
		BigDecimal avgs = relativeMileage.divide(new BigDecimal(10));
				/*循环数组，取出损失类型放入java bean*/
		for (DefectMetaLossFeatureType featureType:typeList){
					/*取出code*/
			String code = featureType.getCode();
					/*取出table备用*/
			String Lable = featureType.getLable();
					/*将code存入实体中传入数据层*/
			IRBF.setFeatureType(code);
			//将avg作为参数传入查询对应里程的金属损失数
			for(int i=1;i<=10;i++){
				// 第几个的相对距离
				BigDecimal avgMileage = new BigDecimal(i).multiply(avgs);
				// Double startMileage=staM+avgMileage-avgs;//计算起始距离里程
				BigDecimal startMileage = staM.add(avgMileage).subtract(avgs);
				//将计算的相对里程+起始里程组合成绝对里程
				BigDecimal endMileage=staM.add(avgMileage);
				//将mileage传入实体中查询
				IRBF.setStartMileage(startMileage.doubleValue());
				IRBF.setEndMileage(endMileage.doubleValue());
				int ls=metalLossMapper.getMetalLossCountByMaleage(IRBF);
				//将取出的值写入表PIC_INSP_DEFECT_STATISTICS中，待查
				//存入PIC_INSP_DEFECT_STATISTICS中的值分别为 ：金属损失类型 、相对里程(m)、开始绝对里程(m)、结束绝对里程(m)
				//损失数/内检测任务ID 管道ID 、管段ID、检测管段ID
				DefectStatistics defectStatistics=new DefectStatistics();
				defectStatistics.setId(CommonUtil.getUUID());
				defectStatistics.setInspTaskId(IRBF.getInspTaskId());
				defectStatistics.setPipeLineId(IRBF.getLineId());
				defectStatistics.setPipeSegmentId(IRBF.getSegmentId());
				defectStatistics.setInspSegmentId(IRBF.getInspSegmentId());
				defectStatistics.setMajorCode(code);//统计类型编号
				defectStatistics.setMinorCode(i+"");
				defectStatistics.setName(Lable);//统计名称
				defectStatistics.setValue(new BigDecimal(ls));//统计的值
				defectStatistics.setRelativeMileage(relativeMileage);//相对里程
				defectStatistics.setBeginMileage(startMileage);//起始里程
				defectStatistics.setEndMileage(endMileage);//终点里程
				defectStatisticsMapper.insert(defectStatistics);
			}

		}

	}

	/**
	 * @Description 将插入表中的统计数据取出
	 * @author 荣华兴
	 * @date 2015年10月15日
	 * @param IRBF
	 * @return
	 */
	public HashMap<String ,Object> findMetalCountForBar(InspresultByFind IRBF) {
		//思路：map存放金属损失类型+两个List分别存放图形显示的data 和 name
		HashMap<String, Object> ma=new HashMap();
		/*将类型传入查询（写入枚举中）*/
		List<DefectMetaLossFeatureType> typeList=new ArrayList<DefectMetaLossFeatureType>();
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_NBJSSS);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_NBZCQX);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_WBJSSS);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_WBZCQX);
		typeList.add(DefectMetaLossFeatureType.ALLMETALOSS);
		/*根据金属损失类型查询*/
		for(DefectMetaLossFeatureType tL:typeList){
			//获得金属损失编号
			String code =tL.getCode();
			//将金属损失类型传入，查询对应的所有值
			IRBF.setFeatureType(code);
			List<DefectStatistics> ls=defectStatisticsMapper.findAllByFeatureType(IRBF);
			ma.put(code, ls);
		}

		return ma;
	}

	/**
	 * @Description: 根据类型查询金属损失的时钟分布数
	 * @Author: 荣华兴
	 * @Create Date: 2015年10月16日
	 * @参数：@param IRBF
	 * @参数：@return
	 * @Return:List
	 */
	public List<Map<String, String>> findMetalTimMap(InspresultByFind IRBF) {
		//将金属损失类型放入javabean中
		HashMap ma=new HashMap();
		List<DefectMetaLossFeatureType> typeList=new ArrayList<DefectMetaLossFeatureType>();
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_NBJSSS);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_NBZCQX);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_WBJSSS);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_WBZCQX);
		for(DefectMetaLossFeatureType dt:typeList){
			String code=dt.getCode();
			IRBF.setFeatureType(code);
			//获得时钟图所需要的整点时间和个数，取出12组值


			List<Map<String, String>> ls = metalLossMapper.findMetalTimMap(IRBF);
			//取出每行数，然后放入数组中
			System.out.println(ls);
			for(Map map : ls){
				map.put("", "");
			}


		}




		metalLossMapper.findMetalTimMap(IRBF);
		return null;
	}

	/**
	 * @Description: 根据类型查询金属损失的时钟分布数（修改版）
	 * @Author: 荣华兴
	 * @Create Date: 2015年10月17日
	 * @参数：@param IRBF
	 * @参数：@return
	 * @Return:List
	 */
	public HashMap getCountBytimap(InspresultByFind IRBF) {
		//将金属损失类型放入javabean中
		HashMap<String ,Object> mf=new HashMap<String ,Object>();
		List<HashMap<String, Object>> ls = null;
		List<DefectMetaLossFeatureType> typeList=new ArrayList<DefectMetaLossFeatureType>();
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_NBJSSS);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_NBZCQX);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_WBJSSS);
		typeList.add(DefectMetaLossFeatureType.METALOSS_TYPE_WBZCQX);
		typeList.add(DefectMetaLossFeatureType.ALLMETALOSS);
		/*将数据取出，封装成格式：{"t":1,"val":"val1","color":1}*/
		for (DefectMetaLossFeatureType dt:typeList){
			ls =new ArrayList();
			String code =dt.getCode();
			IRBF.setFeatureType(code);

			HashMap<String ,BigDecimal> ma=metalLossMapper.getCountBytimap(IRBF);
			HashMap map1=new HashMap();
			BigDecimal a1=(BigDecimal) (ma.get("A1")==null?new BigDecimal(0):ma.get("A1"));
			map1.put("t", 1);
			map1.put("val", a1);
			map1.put("color",1);
			HashMap map2=new HashMap();
			BigDecimal a2=(BigDecimal) (ma.get("A2")==null?new BigDecimal(0):ma.get("A2"));
			map2.put("t", 2);
			map2.put("val", a2);
			map2.put("color",2);
			HashMap map3=new HashMap();
			BigDecimal a3=(BigDecimal) (ma.get("A3")==null?new BigDecimal(0):ma.get("A3"));
			map3.put("t", 3);
			map3.put("val", a3);
			map3.put("color",3);
			HashMap map4=new HashMap();
			BigDecimal a4=(BigDecimal) (ma.get("A4")==null?new BigDecimal(0):ma.get("A4"));
			map4.put("t", 4);
			map4.put("val", a4);
			map4.put("color",4);
			HashMap map5=new HashMap();
			BigDecimal a5=(BigDecimal) (ma.get("A5")==null?new BigDecimal(0):ma.get("A5"));
			map5.put("t", 5);
			map5.put("val", a5);
			map5.put("color",5);
			HashMap map6=new HashMap();
			BigDecimal a6=(BigDecimal) (ma.get("A6")==null?new BigDecimal(0):ma.get("A6"));
			map6.put("t", 6);
			map6.put("val", a6);
			map6.put("color",6);
			HashMap map7=new HashMap();
			BigDecimal a7=(BigDecimal) (ma.get("A7")==null?new BigDecimal(0):ma.get("A7"));
			map7.put("t", 7);
			map7.put("val", a7);
			map7.put("color",7);
			HashMap map8=new HashMap();
			BigDecimal a8=(BigDecimal) (ma.get("A8")==null?new BigDecimal(0):ma.get("A8"));
			map8.put("t", 8);
			map8.put("val", a8);
			map8.put("color",8);
			HashMap map9=new HashMap();
			BigDecimal a9=(BigDecimal) (ma.get("A9")==null?new BigDecimal(0):ma.get("A9"));
			map9.put("t", 9);
			map9.put("val", a9);
			map9.put("color",9);
			HashMap map10=new HashMap();
			BigDecimal a10=(BigDecimal) (ma.get("A10")==null?new BigDecimal(0):ma.get("A10"));
			map10.put("t", 10);
			map10.put("val", a10);
			map10.put("color",10);
			HashMap map11=new HashMap();
			BigDecimal a11=(BigDecimal) (ma.get("A11")==null?new BigDecimal(0):ma.get("A1"));
			map11.put("t", 11);
			map11.put("val", a11);
			map11.put("color",11);
			HashMap map12=new HashMap();
			BigDecimal a12=(BigDecimal) (ma.get("A12")==null?new BigDecimal(0):ma.get("A12"));
			map12.put("t", 12);
			map12.put("val", a12);
			map12.put("color",12);
			ls.add(map1);
			ls.add(map2);
			ls.add(map3);
			ls.add(map4);
			ls.add(map5);
			ls.add(map6);
			ls.add(map7);
			ls.add(map8);
			ls.add(map9);
			ls.add(map10);
			ls.add(map11);
			ls.add(map12);
			mf.put(code, ls);
		}

		//确定a的取值范围，给color定值
		return mf;
	}

	@Override
	public HashMap findNewsTask() {
		return metalLossMapper.findNewsTask();
	}


}
